


P1() {  // 生产者
    x = produce();  // 生成一个正整数
    P(empty);       // 等待缓冲区有空的单元
    P(mutex);       // 互斥访问缓冲区
    put();          // 将正整数 x 送到缓冲区
    V(mutex);

    if (x % 2 == 0) { // 产生偶数
        V(sem_even);  // 通知 P3 
    } else {          // 产生奇数
        V(sem_odd);   // 通知 P2       
    } 
}

P2() {  // 消费者
    P(sem_odd);     // 等待 P1 产生奇数
    P(mutex);       // 互斥访问缓冲区
    odd = getodd(); // 从缓冲区取出一个奇数
    V(mutex);
    V(empty);       // 通知 P1，缓冲区有一个空的单元
    countodd();     // 统计奇数个数
}

P3() {  // 消费者
    P(sem_even);     // 等待 P1 产生偶数
    P(mutex);         // 互斥访问缓冲区
    even = geteven(); // 从缓冲区取出一个偶数
    V(mutex);
    V(empty);       // 通知 P1，缓冲区有一个空的单元
    counteven();     // 统计偶数个数
}


